/**
 * \file volume.c
 * \brief Driver du controle du volume.
 * \author Mengzuan.Z
 * \version 0.8
 * \date 22 février 2011
 *
 * Fichier d'implémentation des APIs de pilotage du potentiomètre numérique
 * controlant le volume de l'autoradio.
 *
 */

#include <msp430x14x.h>
//#include <io.h>
//#include <signal.h>
//#include <iomacros.h>
#include "volume.h"

#include "../utils/utils.h"

/**
* \def	CS_ON		  	
* Mise à un du port P6.6
* \def	CS_OFF			
* Mise à zéro du port P6.6
* \def	SEL_ON			
* Mise à un du port P6.7		
* \def	SEL_OFF			
* Mise à zéro du port P6.7
*/

#define			CS_ON				P6OUT |= BIT6     	//P6.6
#define			CS_OFF				P6OUT &= ~BIT6     	//P6.6
#define			SEL_ON				P6OUT |= BIT7     	//P6.7		select POT-NUM path
#define			SEL_OFF				P6OUT &= ~BIT7     	//P6.7


//This file contains driver functions for the sound.
//A test programm for these functions is supplied at the end of the file. 

void PRINT_POT(int cmd, int nb)		{
// value should be 0<val<255
	int i,k=0;
	int n=0;
	char bin[8];
	SEL_ON;				// select POT-NUM path
	CS_ON;
	delayx100us(1);
	CS_OFF;
	
	// cmde byte for POT :8 higher 16bits  
	// 0b 0001.0001 > write data on POT0
	// 0b 0010.0001 > shutdown POT0
	// 0b 0011.000x > no command executed	
	
	i=128;
	k=0;
	if (cmd>255) cmd=255;
	if (cmd<0) cmd=0;
	n=cmd;
		while (k<8)
		{
			if ((n-i)<0) 
			{  
				P6OUT &=~0x70;	// DIN=0 	SCLK=0	 CS=0 	
			
				P6OUT |=0x20;	//SCLK=1
			
				P6OUT &=~0x20;	// SCLK=0
			
				bin[k]='0';
			}
			else if ((n-i)>=0)
			{
				P6OUT |=0x10;	// DIN=1 	SCLK=0	 CS=0 
							
				P6OUT |=0x20;	//SCLK=1
				
				P6OUT &=~0x20;	// SCLK=0
				
				bin[k]='1';
				n=n-i;
			}
			i=i/2;
			k=k+1;  
		}	
	
	i=128;
	k=0;
	if (nb>255) nb=255;
	if (nb<0) nb=0;
	n=nb;
		while (k<8)
		{
			if ((n-i)<0) 
			{  
				P6OUT &=~0x70;	// DIN=0 	SCLK=0	 CS=0 	
			
				P6OUT |=0x20;	//SCLK=1
			
				P6OUT &=~0x20;	// SCLK=0
			
				bin[k]='0';
			}
			else if ((n-i)>=0)
			{
				P6OUT |=0x10;	// DIN=1 	SCLK=0	 CS=0 
							
				P6OUT |=0x20;	//SCLK=1
				
				P6OUT &=~0x20;	// SCLK=0
				
				bin[k]='1';
				n=n-i;
			}
			i=i/2;
			k=k+1;  
		}	
		
	CS_ON;	
	delayMinMaj(200,10);
	//SEL_OFF;		// on reste en volume par defaut
	
}		

int setVolume(int newVolume)
{	
	getBus();
	PRINT_POT(31,newVolume*32); //give new volume value
	releaseBus();
	return newVolume;
}

void mute()
{
	getBus();
	PRINT_POT(47,0); //0b 0010 0001 > shutdown POT0
	releaseBus();
}
